package com.taxx.service.impl;

import com.taxx.service.DecryptService;
import com.taxx.util.DataCompressionUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.Base64;

/**
 * 解密服务实现类
 * 
 * @author taxx
 * @since 2024-01-01
 */
@Slf4j
@Service
public class DecryptServiceImpl implements DecryptService {
    
    @Override
    public String decrypt(String encryptedData) {
        try {
            if (encryptedData == null || encryptedData.trim().isEmpty()) {
                log.warn("加密数据为空");
                return null;
            }
            
            log.debug("开始解密数据，数据长度：{}", encryptedData.length());
            
            // 税务系统返回的Data字段通常是Base64编码的GZIP压缩数据
            // 使用现有的DataCompressionUtil进行解压缩
            String decryptedData = DataCompressionUtil.decompressFromGzipBase64(encryptedData);
            
            if (decryptedData != null) {
                log.debug("数据解密成功，解密后长度：{}", decryptedData.length());
                return decryptedData;
            } else {
                log.error("数据解密失败，返回null");
                return null;
            }
            
        } catch (Exception e) {
            log.error("解密数据失败，加密数据：{}", encryptedData, e);
            
            // 如果GZIP解压缩失败，尝试其他解密方式
            return tryAlternativeDecryption(encryptedData);
        }
    }
    
    /**
     * 尝试其他解密方式
     */
    private String tryAlternativeDecryption(String encryptedData) {
        try {
            // 方式1：尝试直接Base64解码（如果不是GZIP压缩）
            try {
                String decodedData = new String(Base64.getDecoder().decode(encryptedData));
                log.info("使用Base64直接解码成功");
                return decodedData;
            } catch (Exception e) {
                log.debug("Base64直接解码失败，尝试其他方式");
            }
            
            // 方式2：如果数据包含特殊字符，可能需要URL安全的Base64解码
            try {
                String decodedData = new String(Base64.getUrlDecoder().decode(encryptedData));
                log.info("使用URL安全Base64解码成功");
                return decodedData;
            } catch (Exception e) {
                log.debug("URL安全Base64解码失败");
            }
            
            // 方式3：如果数据本身就是明文，直接返回
            if (isPlainText(encryptedData)) {
                log.info("数据本身就是明文，无需解密");
                return encryptedData;
            }
            
            log.error("所有解密方式都失败");
            return null;
            
        } catch (Exception e) {
            log.error("尝试其他解密方式失败", e);
            return null;
        }
    }
    
    /**
     * 判断是否为明文数据
     */
    private boolean isPlainText(String data) {
        if (data == null || data.length() < 10) {
            return false;
        }
        
        // 检查是否包含JSON特征
        String trimmed = data.trim();
        if (trimmed.startsWith("{") && trimmed.endsWith("}")) {
            return true;
        }
        if (trimmed.startsWith("[") && trimmed.endsWith("]")) {
            return true;
        }
        
        // 检查是否包含常见的业务字段
        String lowerData = data.toLowerCase();
        if (lowerData.contains("returncode") || lowerData.contains("returnmsg") || 
            lowerData.contains("success") || lowerData.contains("message")) {
            return true;
        }
        
        return false;
    }
    
    /**
     * 设置解密方式（可以通过配置文件配置）
     */
    public void setDecryptionMethod(String method) {
        log.info("设置解密方式：{}", method);
        // 这里可以根据配置动态选择解密方式
    }
}
